package 力扣.中等;

import java.util.Arrays;

/*
在整数数组 nums 中，是否存在两个下标 i 和 j，使得 nums [i] 和 nums [j] 的差的绝对值小于等于 t ，且满足 i 和 j 的差的绝对值也小于等于 ķ 。

如果存在则返回 true，不存在返回 false。

 

示例 1:

输入: nums = [1,2,3,1], k = 3, t = 0
输出: true
示例 2:

输入: nums = [1,0,1,1], k = 1, t = 2
输出: true
示例 3:

输入: nums = [1,5,9,1,5,9], k = 2, t = 3
输出: false


解法1：常规思想 进行双重遍历会超时
解法2：用TreeSet
这个方法的前提是对 TreeSet 这个数据结构要了解。其中有一个方法 public E ceiling(E e) ，返回 treeSet 中大于等于 e 的元素中最小的元素，如果没有大于等于 e 的元素就返回 null。

还有一个对应的方法，public E floor(E e)，返回 treeSet 中小于等于 e 的元素中最大的元素，如果没有小于等于 e 的元素就返回 null。

并且两个方法的时间复杂度都是 O(log(n))。

知道了这个就好说了，我们依旧是解法二那样的滑动窗口，举个例子。


k = 3,  t = 2, 窗口内 3 个数用 TreeSet 存储, 当前考虑 x
2 6 3 x 5
^   ^
此时我们去寻找窗口中是否存在 x - t ~ x + t 的元素。

如果我们调用 ceilling(x - t) 返回了 c，c 是窗口内大于等于 x - t 中最小的数。
只要 c 不大于 x + t, 那么 c 一定是我们要找的了。否则的话，窗口就继续右移。

代码的话，由于溢出的问题，运算的时候我们直接用 long 强转。


* */
public class 存在重复元素 {
    public static void main(String[] args) {

        Boolean a=false;
        int[] nums={-2147483648,2147483647};
        int k=1;
        int t=1;


        for(int i=0;i<nums.length;i++){
           for(int j=i+1;j<i+k+1;j++){
               if(j>=nums.length){
                   break;
               }
               Double a1=Double.valueOf(Math.abs(nums[j]-nums[i]));
//               Double a2=Double.valueOf(nums[j]);
               System.out.println(a1);
               if(a1<=t){

                   a=true;
               }
           }
        }


        System.out.println(a);
    }
}
